BLAS

什么是BLAS

BLAS是 Basic Linear Algebra Subprograms (基本线性代数子程序)的首字母缩写,主要用来做基础的矩阵计算,或者是向量计算。它分为三级:

  • BLAS 1级,主要是向量与向量的计算
  • BLAS 2级,主要是矩阵和向量的计算
  • BLAS 3级,主要是矩阵和矩阵的计算,最典型的是A矩阵*B矩阵,得到一个C矩阵。

为什么BLAS是一个非常重要的库或者接口,是因为它是很多科学计算的核心之一。每年做超级计算机的排行榜,都要做LINPACK测试,该测试很多部分就是做BLAS 3级矩阵和矩阵的计算。此外,还有很多科学和工程的模拟,在转换后都变成了一种矩阵上的操作。如果你把矩阵优化的特别好的话,对整个应用的提升,都是非常有帮助的。

广泛用于LAPACK

疑问: 有没有tensor计算?
tensor计算要转化成以上三个级别的计算吗?没有。numpy支持高阶矩阵(多维数组)计算。

注意subprograms这个词,表示线性代数库的子项目

BLAS与深度学习

经过测试,发现Alexnet大部分的时间花费在卷积层(Conv Layer),另外不少时间花在了全连接层(FC layer)。

  • 卷基层目前通用的实现是展成矩阵,变成矩阵与矩阵的乘法,就是BLAS 3级。
  • 全连接层一般是变成一个矩阵和向量的乘法,也落成了BLAS操作。

也就是说,基于矩阵类学习的深度学习,有90%或者更多的时间是通过BLAS来操作的。当然,随着新的算法出现,卷积层对3*3的卷积核有专门的算法,或者用FFT类类算法也可以做,但是在通用上,展矩阵来做也非常广泛。

疑问: cuda也兼容BLAS接口吗?还是自己独立的接口?

BLAS实现

BLAS只是定义了接口,但是具体的实现其实有很多种。从商业的角度来讲,存在很多商业版本。基本上为了搭配自己的硬件,对其做了更优的优化。常见的商业版本有

  • Intel MKL
  • AMD ACML
  • NVIDIA CUBLAS
  • IBM ESSL

开源

  • GotoBLAS:(2010年中止开发)
  • ATLAS: 美国一所学校开发
  • OpenBLAS: 基于GotoBLAS
  • BLIS: 基于GotoBLAS扩展出来的一个项目